﻿Imports Newtonsoft.Json

''' <summary>
''' 对话请求体
''' </summary>
Public Class ChatRequest
    ''' <summary>
    ''' 对话的消息列表
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("messages")>
    Public Property Messages As List(Of MessagesType)

    ''' <summary>
    ''' 使用的模型的 ID。您可以使用 deepseek-chat,deepseek-reasoner
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("model"), JsonConverter(GetType(EnumJsonConverter(Of ModelEnum)))>
    Public Property Model As ModelEnum = ModelEnum.MoonShotV1Auto

    ''' <summary>
    ''' 聊天完成时生成的最大 token 数。如果到生成了最大 token 数个结果仍然没有结束，finish reason 会是 "length", 否则会是 "stop"
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("max_tokens")>
    Public Property MaxTokens As Integer = 4096


    ''' <summary>
    ''' 使用什么采样温度，介于 0 和 1 之间。较高的值（如 0.7）将使输出更加随机，而较低的值（如 0.2）将使其更加集中和确定性
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("temperature")>
    Public Property Temperature As Single = 0.3

    ''' <summary>
    ''' 另一种采样方法，即模型考虑概率质量为 top_p 的标记的结果。因此，0.1 意味着只考虑概率质量最高的 10% 的标记。一般情况下，我们建议改变这一点或温度，但不建议 同时改变
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("top_p")>
    Public Property TopP As Single = 1

    ''' <summary>
    ''' 为每条输入消息生成多少个结果
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("n")>
    Public Property N As Integer = 1

    ''' <summary>
    ''' 存在惩罚，介于-2.0到2.0之间的数字。正值会根据新生成的词汇是否出现在文本中来进行惩罚，增加模型讨论新话题的可能性
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("presence_penalty")>
    Public Property PresencePenalty As Single = 0


    ''' <summary>
    ''' 频率惩罚，介于-2.0到2.0之间的数字。正值会根据新生成的词汇在文本中现有的频率来进行惩罚，减少模型一字不差重复同样话语的可能性
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("frequency_penalty")>
    Public Property FrequencyPenalty As Single = 0


    ''' <summary>
    ''' 一个 object，指定模型必须输出的格式。
    ''' 设置为 { "type" "json_object" } 以启用 JSON 模式，该模式保证模型生成的消息是有效的 JSON。
    ''' 注意: 使用 JSON 模式时，你还必须通过系统或用户消息指示模型生成 JSON。
    ''' 否则，模型可能会生成不断的空白字符，直到生成达到令牌限制，从而导致请求长时间运行并显得“卡住”。
    ''' 此外，如果 finish_reason="length"，这表示生成超过了 max_tokens 或对话超过了最大上下文长度，消息内容可能会被部分截断。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("response_format")>
    Public Property ResponseFormat As ResponseFormatType

    ''' <summary>
    ''' 停止词，当全匹配这个（组）词后会停止输出，这个（组）词本身不会输出。最多不能超过 5 个字符串，每个字符串不得超过 32 字节
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stop")>
    Public Property [Stop] As String()

    ''' <summary>
    ''' 如果设置为 True，将会以 SSE（server-sent events）的形式以流式发送消息增量。消息流以 data: [DONE] 结尾
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stream")>
    Public Property Stream As Boolean = False

    ''' <summary>
    ''' 消息类型
    ''' </summary>
    Public Class MessagesType

        ''' <summary>
        ''' 消息的内容
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("content")>
        Public Property Content As String

        ''' <summary>
        ''' 该消息的发起角色
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("role"), JsonConverter(GetType(EnumJsonConverter(Of RoleEnum)))>
        Public Property Role As RoleEnum

    End Class


    ''' <summary>
    ''' 输出类型
    ''' </summary>
    Public Class ResponseFormatType

        ''' <summary>
        ''' 格式类型  JsonConverter(GetType(Converters.StringEnumConverter)
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("type"), JsonConverter(GetType(EnumJsonConverter(Of FormatEnum)))>
        Public Property Type As FormatEnum = FormatEnum.JsonObject
    End Class

    ''' <summary>
    ''' 角色枚举
    ''' </summary>
    Public Enum RoleEnum
        ''' <summary>
        ''' 系统默认角色
        ''' </summary>
        <JsonProperty("system")> System = 0
        ''' <summary>
        ''' 用户角色
        ''' </summary>
        <JsonProperty("user")> User = 1
        ''' <summary>
        ''' 助手角色(多轮对话)
        ''' </summary>
        <JsonProperty("assistant")> Assistant = 2
    End Enum

    ''' <summary>
    ''' 模型枚举
    ''' </summary>
    Public Enum ModelEnum
        <JsonProperty("moonshot-v1-auto")> MoonShotV1Auto = 0
        <JsonProperty("moonshot-v1-8k")> MoonShotV1_8k = 1
        <JsonProperty("moonshot-v1-32k")> MoonShotV1_32k = 2
        <JsonProperty("moonshot-v1-128k")> MoonShotV1_128k = 3
        <JsonProperty("kimi-latest")> KimiLatest = 4
        <JsonProperty("moonshot-v1-8k-vision-preview")> MoonShotV1_8kVisionPreview = 5
        <JsonProperty("moonshot-v1-128k-vision-preview")> MoonShotV1_288kVisionPreview = 6
    End Enum

    ''' <summary>
    ''' 输出格式
    ''' </summary>
    Public Enum FormatEnum
        <JsonProperty("text")> Text = 0
        <JsonProperty("json_object")> JsonObject = 0
    End Enum
End Class
